Portals 是一種讓 children 可以 render 到
parent component DOM 樹以外 DOM 節點的方法,
適合拿來做彈窗等許多地方都會用到的組件。
ReactDOM.createPortal(child, container)
createPortal 方法在
react-dom
而非react
裡面
React 不會建立一個新的 div,
而是把第一個引數的子元素
渲染到 container 中。
import { createPortal } from 'react-dom'
const PortalsComponent = () =>{
return createPortal(
<div>我是一些文字</div>,
document.getElementById('root')
)
}
class PortalsExample extends Component{
render(){
return(
<>
<PortalsComponent />
</>
)
}
}
export default PortalsExample
以下彈窗回傳的是一個createPortal
所產生的元素
import React, { Component } from 'react';
import { createPortal } from 'react-dom'
import style from './style/modal.module.scss'
class PopUp extends Component {
render(){
return createPortal(
<div className={style.modal}>
{this.props.children}
</div>,
document.getElementById('root')
)
}
}
export default PopUp
在而任意地方使用 <PopUp>
都不會受到父元件的影響
而是會 render 在根元素(#root
)底下。
<PopUp>我是彈窗內容</PopUp>
不管某個 children component 是不是用 Portal 建立的
Parent component 都一樣可以捕捉
從底下元件 bubble 上來的 event